package com.sjz.controller;

import com.sjz.po.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/****
 * * 1、@RequestBody：将请求体中的内容和控制器方法的形参进行绑定
 *  * 2、使用@RequestBody注解将json格式的请求参数转换为java对象
 *  * a>导入jackson的依赖
 *  * b>在SpringMVC的配置文件中设置<mvc:annotation-driven />
 *  * c>在处理请求的控制器方法的形参位置，直接设置json格式的请求参数要转换的java类型的形参，使用@RequestBody注解标识即可
 *  * 3、@ResponseBody：将所标识的控制器方法的返回值作为响应报文的响应体响应到浏览器
 *  * 4、使用@ResponseBody注解响应浏览器json格式的数据
 *  * a>导入jackson的依赖
 *  * b>在SpringMVC的配置文件中设置<mvc:annotation-driven />
 *  * c>将需要转换为json字符串的java对象直接作为控制器方法的返回值，使用@ResponseBody注解标识控制器方法
 *  * 就可以将java对象直接转换为json字符串，并响应到浏览器
 *  *
 *  * 常用的Java对象转换为json的结果：
 *  * 实体类-->json对象
 *  * map-->json对象
 *  * list-->json数组
 */
@Controller
public class TestController {

    /***
     * @RequestBody可以获取请求体信息，使用@RequestBody注解标识控制器方法的形参，当前请求的请
     * 求体就会为当前注解所标识的形参赋值
     * @param requestBody
     * @return
     */
    @RequestMapping(value = "/test/RequestBody",method = RequestMethod.POST)
    public String testRequestBody(@RequestBody String requestBody){
        System.out.println("requestBody:"+requestBody);//requestBody:username=kermit&password=kermit
        return "success";
    }

    /**
     在使用了axios发送ajax请求之后，浏览器发送到服务器的请求参数有两种格式：
     1、name=value&name=value...，此时的请求参数可以通过request.getParameter()获取，对应
     SpringMVC中，可以直接通过控制器方法的形参获取此类请求参数
     2、{key:value,key:value,...}，此时无法通过request.getParameter()获取，之前我们使用操作
     json的相关jar包gson或jackson处理此类请求参数，可以将其转换为指定的实体类对象或map集
     合。在SpringMVC中，直接使用@RequestBody注解标识控制器方法的形参即可将此类请求参数
     转换为java对象
     * **/


    /***
     *测试requestBody
     * @param id
     * @param requestBody
     * @param response
     * @throws IOException
     */
    @RequestMapping("/test/ajax")
    public void testAjax(Integer id, @RequestBody String requestBody, HttpServletResponse response) throws IOException {
        System.out.println("requestBody:"+requestBody);
        System.out.println("id:"+id);
        response.getWriter().write("hello,axios");
    }

    /****
     * RequestBody   解决requestbody处理json
     * @param map
     * @param response
     * @throws IOException
     */
    @RequestMapping("/test/RequestBody/json")
    public void testRequestBody(@RequestBody Map<String, Object> map, HttpServletResponse response) throws IOException {
        System.out.println(map);
        response.getWriter().write("hello,RequestBody");
    }

    public void testRequestBody(@RequestBody User user, HttpServletResponse response) throws IOException {
        System.out.println(user);
        response.getWriter().write("hello,RequestBody");
    }

    /****
     * 解决@ResponseBody 解决相应
     * @return
     */
    @RequestMapping("/test/ResponseBody")
    @ResponseBody
    public String testResponseBody(){
        return "success";
    }

    /***
     * @ResponseBody用于标识一个控制器方法，可以将该方法的返回值直接作为响应报文的响应体响应到
     * 浏览器
     * @return
     */
/*
    public List<User> testResponseBodyJson(){
        User user1 = new User(1001, "admin1", "123456", 20, "男");
        User user2 = new User(1002, "admin2", "123456", 20, "男");
        User user3 = new User(1003, "admin3", "123456", 20, "男");
        List<User> list = Arrays.asList(user1, user2, user3);
        return list;
    }*/

    /*****
     * 服务器处理ajax请求之后，大多数情况都需要向浏览器响应一个java对象，此时必须将java对象转换为
     * json字符串才可以响应到浏览器，之前我们使用操作json数据的jar包gson或jackson将java对象转换为
     * json字符串。在SpringMVC中，我们可以直接使用@ResponseBody注解实现此功能
     * @return
     */
    @RequestMapping("/test/ResponseBody/json")
    @ResponseBody
    public Map<String, Object> testResponseBodyJson(){
        User user1 = new User(1001, "admin1", "123456", 20, "男");
        User user2 = new User(1002, "admin2", "123456", 20, "男");
        User user3 = new User(1003, "admin3", "123456", 20, "男");
        Map<String, Object> map = new HashMap<>();
        map.put("1001", user1);
        map.put("1002", user2);
        map.put("1003", user3);
        return map;
    }
    /*public User testResponseBodyJson(){
        User user = new User(1001, "admin", "123456", 20, "男");
        return user;
    }*/

    /*****
     //以name=value&name=value的方式发送的请求参数
     //不管使用的请求方式是get或post，请求参数都会被拼接到请求地址后
     //此种方式的请求参数可以通过request.getParameter()获取
     params:{},
     //以json格式发送的请求参数
     //请求参数会被保存到请求报文的请求体传输到服务器
     //此种方式的请求参数不可以通过request.getParameter()获取
     data:{}
     */


    /***
     * 异常的测试类
     * @return
     */
    @RequestMapping("/test/hello")
    public String testHello(){
        System.out.println(1/0);
        return "success";
    }

}
